#include "mainwindow1.h"
#include "ui_mainwindow1.h"

/*QStandardItemModel: 用于存储表格数据，并设置表头。
QSqlQuery: 用于执行SQL查询，从数据库中获取用户数据。
QNetworkAccessManager: 用于发送网络请求，获取音乐数据。
QJsonDocument: 用于解析服务器返回的JSON数据。
QMessageBox: 用于显示提示信息。*/
MainWindow1::MainWindow1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow1)
{
    ui->setupUi(this);
    // 读取并应用样式表文件
    QFile file(":/E:/【05临时文件】/mianwindow1.qss");
    if (file.open(QFile::ReadOnly)) {
        QString stylesheet = QString(file.readAll());
        setStyleSheet(stylesheet);
        file.close();
    }
    // 创建一个QStandardItemModel对象，用于存储表格数据
    pModel = new QStandardItemModel(10, 4, ui->tableView);
    // 设置表格的表头
    QStringList list = QStringList() << "歌名" << "专辑" << "歌手名"<<"歌曲时长";
    pModel->setHorizontalHeaderLabels(list); // 设置表头

    ui->tableView->setModel(pModel); // 将模型设置到表格视图中

    //    // 初始化数据库操作类
    //    mydatabase = new databaseop;
    //    QSqlQuery sqlQuery;

    //    // 查询数据库中的用户数据
    //    QString sql = "SELECT * FROM user;";
    //    mydatabase->normalExec(sqlQuery, sql);
    //    int row = 0;
    //    while (sqlQuery.next() == true) {
    //        for (int column = 0; column < 3; ++column) {
    //            QString str = sqlQuery.value(column).toString();
    //            QStandardItem *item = new QStandardItem(str);
    //            pModel->setItem(row, column, item); // 将数据项添加到模型中
    //        }
    //        row++;
    //    }

    // 创建一个网络访问管理对象
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*))); // 连接网络请求完成信号到槽函数

    //音乐播放
    playlist = new QMediaPlaylist;
    player = new QMediaPlayer;
    player->setPlaylist(playlist);

    connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(durationChangedSlot(qint64)));
    connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChangedSlot(qint64)));

}

MainWindow1::~MainWindow1()
{
    delete ui; // 释放UI资源
}

void MainWindow1::on_pushButton_clicked()
{
    QString Search = ui->lineEdit->text();
    if (Search.isEmpty())
    {
        QMessageBox::warning(this, "提示", "请输入搜索关键词");
        return;
    }

    // 发送网络请求，获取音乐数据
    manager->get(QNetworkRequest(QUrl(QString("http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s=%1&type=1&offset=0&total=true&limit=10").arg(Search))));


    //    // 获取用户输入的用户名、密码和电话
    //    QString name = ui->lineEdit->text();
    //    QString password = ui->lineEdit_2->text();
    //    QString tel = ui->lineEdit_3->text();

    //    // 查询数据库中是否已存在该电话号码
    //    QSqlQuery query;
    //    QString sql = QString("SELECT * FROM user where tel='%1';").arg(tel);
    //    mydatabase->normalExec(query, sql);
    //    if (query.next() == true) {
    //        // 如果电话号码已存在，提示用户
    //        QMessageBox::about(this, "提示", "该电话已经注册过，请重新输入电话");
    //    } else {
    //        // 插入新用户数据到数据库
    //        QString sql = QString("INSERT INTO user VALUES ('%1','%2','%3');").arg(name).arg(password).arg(tel);
    //        qDebug() << sql << endl;
    //        mydatabase->normalExec(query, sql);
    //    }


}

// 处理网络请求的响应
void MainWindow1::replyFinished(QNetworkReply* reply)
{
    qDebug() << "--------\"hello\"--------" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) << endl;
    // 检查HTTP状态码
    if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 200) {
        qDebug() << "访问服务器成功" << endl;
        // 解析服务器返回的JSON数据
        parseJson(reply->readAll());
    }
}

// 解析JSON数据
void MainWindow1::parseJson(QByteArray byteArray)
{
    unsigned int id = -1; //避免数值越界
    QString songName;
    QString albumName;
    QString singerName;
    float duration = -1;
    musicIdlist.clear();
    playlist->clear();

    QJsonDocument doc = QJsonDocument::fromJson(byteArray);//直接从字节数组中获得一个JSON文档
    if(doc.isObject())//问文档内部是否是一个对象？
    {
        QJsonObject obj1 = doc.object();//返回文档内的对象
        if(obj1.contains("result") == false)//问文档对象是否包含result关键字
        {
            qDebug()<<"错误的JSON对象"<<endl;
            return;
        }
        QJsonValue var = obj1.value("result");//获得关键字result对应的结果
        if(var.isObject() == false)
        {
            qDebug()<<"result的值不是一个对象"<<endl;
            return;
        }
        QJsonObject resultObj = var.toObject();//把result的值转为一个对象
        if(resultObj.contains("songs") == false)
        {
            qDebug()<<"JSON对象没有歌曲"<<endl;
            return;
        }
        var = resultObj.value("songs");//得到关键字songs的值
        if(var.isArray())//是否为数组？
        {
            QJsonArray songsArr = var.toArray();//把songs的值转为一个数组
            qDebug()<<"一共搜索到"<<songsArr.size()<<"首歌曲"<<endl;
            for(int i = 0 ; i < songsArr.size() ; i++)
            {
                QJsonObject songObj = songsArr[i].toObject();//把下标为i的元素转为对象
                if(songObj.contains("id"))
                {
                    QJsonValue varID = songObj.value("id");//获取关键字为id的元素的值
                    id = varID.toDouble();//把值转为double型，避免数值越界
                }
                if(songObj.contains("name"))
                {
                    QJsonValue varName = songObj.value("name");
                    songName = varName.toString();
                }
                if(songObj.contains("album"))//是否包含专辑
                {
                    QJsonValue varAlbum = songObj.value("album");//得到专辑关键字的值
                    if(varAlbum.isObject())
                    {
                        QJsonObject albumObj = varAlbum.toObject();//把专辑的值转为对象
                        if(albumObj.contains("name"))
                        {
                            QJsonValue varAlbumName =  albumObj.value("name");
                            albumName = varAlbumName.toString();//得到专辑名
                        }
                    }
                }
                if(songObj.contains("artists"))//是否包含作者关键字
                {
                    QJsonValue varArtists = songObj.value("artists");
                    if(varArtists.isArray())//作者的值是否为数组？
                    {
                        QJsonArray arrArtists = varArtists.toArray();
                        for (int i = 0; i < arrArtists.size(); ++i) {//遍历作者数组
                            if(arrArtists[i].isObject())
                            {
                                QJsonObject artistsObj = arrArtists[i].toObject();
                                if(artistsObj.contains("name"))
                                {
                                    QJsonValue varArtistsName = artistsObj.value("name");
                                    singerName+= varArtistsName.toString();//把名字加入到字符串中
                                    singerName+=" ";//中间留一个空格
                                }
                            }
                        }
                    }
                }
                if(songObj.contains("duration"))
                {
                    QJsonValue varDuration = songObj.value("duration");//获取关键字为duration的元素的值
                    duration = varDuration.toInt()/1000/60.0F;//把值转为整数
                }
                qDebug()<<id<<" "<<songName<<" "<<albumName<<" "<<singerName<<" "<<duration<<endl;
                musicIdlist.push_back(id);
                playlist->addMedia(QUrl(QString("http://music.163.com/song/media/outer/url?id=%1.mp3").arg(id)));
                QStandardItem *item = new QStandardItem(songName);//歌名
                pModel->setItem(i, 0, item);
                item = new QStandardItem(albumName);
                pModel->setItem(i, 1, item);
                item = new QStandardItem(singerName);
                pModel->setItem(i, 2, item);
                item = new QStandardItem(QString("%1").arg(duration));
                pModel->setItem(i, 3, item);
                singerName = "";//清空歌手名
            }
            playlist->setCurrentIndex(0);
        }
    }
}

// 表格视图双击事件的槽函数
void MainWindow1::on_tableView_doubleClicked(const QModelIndex &index)
{
    // 设置播放列表的当前索引为双击的行
    playlist->setCurrentIndex(index.row());

    // 播放当前索引的媒体
    player->play();

    // 获取当前播放的歌曲信息
    QString songName = pModel->item(index.row(), 0)->text();
    QString artistName = pModel->item(index.row(), 2)->text();

    // 更新正在播放的歌曲信息
    updateNowPlayingLabel(songName, artistName);
}

// 媒体播放器时长变化的槽函数
void MainWindow1::durationChangedSlot(qint64 duration)
{
    // 输出当前歌曲的总时长
    qDebug() << "当前歌曲的总时长为" << (duration / 1000 / 60.0f) << "分钟" << endl;

    // 设置水平滑块的范围为 0 到歌曲的总时长
    ui->horizontalSlider->setRange(0, duration);
}

// 媒体播放器位置变化的槽函数
void MainWindow1::positionChangedSlot(qint64 position)
{
    // 输出当前播放位置
    qDebug() << (position / 1000 / 60.0f) << endl;

    // 设置水平滑块的值为当前播放位置
    ui->horizontalSlider->setValue(position);
}

// 水平滑块释放事件的槽函数
void MainWindow1::on_horizontalSlider_sliderReleased()
{
    // 获取水平滑块的值
    qint64 var = ui->horizontalSlider->value();

    // 设置媒体播放器的位置为水平滑块的值
    player->setPosition(var);
}

// 播放下一首歌曲的槽函数
void MainWindow1::on_pushButton_5_clicked()
{
    // 获取播放列表的下一个索引
    int nextIndex = playlist->nextIndex();

    // 如果下一个索引有效，则播放下一首歌曲
    if (nextIndex >= 0 && nextIndex < playlist->mediaCount()) {
        playlist->setCurrentIndex(nextIndex);
        player->play();

        // 获取当前播放的歌曲信息
        QString songName = pModel->item(nextIndex, 0)->text();
        QString artistName = pModel->item(nextIndex, 2)->text();

        // 更新正在播放的歌曲信息
        updateNowPlayingLabel(songName, artistName);
    }
}

// 更新正在播放的歌曲信息的槽函数
void MainWindow1::updateNowPlayingLabel(const QString &songName, const QString &artistName)
{
    // 更新正在播放的歌曲信息
        ui->labelNowPlaying->setText(QString("正在播放: %1 - %2").arg(songName).arg(artistName));
}



// 播放上一首歌曲的槽函数
void MainWindow1::on_pushButton_4_clicked()
{
    // 获取播放列表的上一个索引
    int previousIndex = playlist->previousIndex();

    // 如果上一个索引有效，则播放上一首歌曲
    if (previousIndex >= 0 && previousIndex < playlist->mediaCount()) {
        playlist->setCurrentIndex(previousIndex);
        player->play();

        // 获取当前播放的歌曲信息
        QString songName = pModel->item(previousIndex, 0)->text();
        QString artistName = pModel->item(previousIndex, 2)->text();

        // 更新正在播放的歌曲信息
        updateNowPlayingLabel(songName, artistName);
    }
}
